package com.dexter.year2023.charpter8_tree_hot_problems.level1.topic1_1双指针;

import com.dexter.year2023.charpter6_tree_level_travel.level1.TreeNode;

/**
 * LeetCode 100. 相同的树
 * https://leetcode.cn/problems/same-tree/
 * <p>
 * 给你两棵二叉树的根节点 p 和 q ，编写一个函数来检验这两棵树是否相同。
 * 如果两个树在结构上相同，并且节点具有相同的值，则认为它们是相同的。
 * <p>
 * 示例 1：
 * 输入：p = [1,2,3], q = [1,2,3]
 * 输出：true
 * 示例 2：
 * 输入：p = [1,2], q = [1,null,2]
 * 输出：false
 * 示例 3：
 * 输入：p = [1,2,1], q = [1,1,2]
 * 输出：false
 * <p>
 * 提示：
 * 两棵树上的节点数目都在范围 [0, 100] 内
 * -104 <= Node.val <= 104
 *
 * @author Dexter
 */
public class LC100IsSameTree {
    public static void main(String[] args) {
        // 3 9 20 15 7 二叉树
        TreeNode node = new TreeNode(3);
        node.left = new TreeNode(9);
        node.right = new TreeNode(20);
        node.right.left = new TreeNode(15);
        node.right.right = new TreeNode(7);
        TreeNode node2 = new TreeNode(3);
        node2.left = new TreeNode(9);
        node2.right = new TreeNode(20);
        node2.right.left = new TreeNode(15);
        node2.right.right = new TreeNode(7);
        // 提交结果：已通过 - 时间击败100% 的Java用户，内存击败54.75% 的Java用户
        System.out.println("两棵树是否相同：" + (isSameTree(node, node2) ? "是" : "否"));
    }

    public static boolean isSameTree(TreeNode p, TreeNode q) {
        // 双指针の核心代码
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        if (p.val != q.val) {
            return false;
        }
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}
